home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 3895 / 3895.xpi / chrome / compact-ce.jar / content / setting.js < prev    next >
Text File  |  2009-09-18  |  32KB  |  840 lines

  1. var Setting = {
  2. selected: [
  3.     "BookmarksButton-menu", "menuMiddleClickOpens",
  4.     "bookmarksMiddleClickOpens", "bookmarksRightClickOpens",
  5.     "historyMiddleClickOpens", "historyRightClickOpens"
  6. ],
  7. checkbox: [
  8.     "hidepopup", "noarrow", "popupmenu",
  9.     "compactGoMenu", "altToggle", "hideBorderTop",
  10.     "enableHotkey", "toolbarCollapsed"
  11. ],
  12. countbox: ["maxCount"],
  13. radiogroup: ["position-menu", "position-bookmarks", "position-history"],
  14.  
  15. currentList: 0,
  16. currentAvailList: 1,
  17. lists: [
  18.     ["menubutton-tree", "available-tree", "avail-toolbar-tree"],
  19.     ["context-tree", "available-tree2", "avail-toolbar-tree2"]
  20. ],
  21.  
  22. updateItem: function(showhide) {
  23.     var string = ["bookmarks-menu", "go-menu", "history-menu", "yb_menu", "pof-menu", "ScrapBookMenu", "bookmarksMenu"];
  24.     for (var i=0; i<string.length; i++) {
  25.         var item = document.getElementsByAttribute("targetId", string[i]);
  26.         var adv = CMCE.firefox.getElementById("cmce-adv-restorePoint-"+string[i]);
  27.         if (CMCE.firefox.getElementById(string[i])) for (var j=0; j<item.length; j++) {
  28.             if (showhide)
  29.                 item[j].hidden = adv;
  30.             else if (adv) {
  31.                 item[j].firstChild.firstChild.setAttribute("properties", "separator");
  32.                 item[j].hidden = false;
  33.             }
  34.             else if (item[j].isAdded) {
  35.                 if (item[j].getAttribute("empty")) {
  36.                     item[j].hidden = true;
  37.                     item[j].firstChild.firstChild.removeAttribute("properties");
  38.                 }
  39.             }
  40.             else
  41.                 item[j].firstChild.firstChild.removeAttribute("properties");
  42.             item[j].allwaysDisabled = adv ? true : false;
  43.         }
  44.     }
  45. },
  46.  
  47. dialogOncommand: function(event){
  48.     var parent = event.target.parentNode.parentNode;
  49.     if (parent.tagName == "menulist")
  50.         try {
  51.             document.getAnonymousElementByAttribute(parent, "class", "menulist-label-box").lastChild.disabled
  52.                 = event.target.getAttribute("disabled");
  53.         } catch(e) {}
  54.  
  55.     var a = event.target.tagName;
  56.     if((a == "checkbox" || a == "menuitem" || a == "radio") && !event.target.hasAttribute("apply")) this.enbleApply();
  57. },
  58.  
  59. cust_loadPrefsDialog: function() {
  60.     CMCE.firefox = Custom.getMainWindow();
  61.     if (!CMCE.firefox) {
  62.         setTimeout(function(){
  63.             CMCE.prompts.alert(null, "Personal Menu", document.getElementById("cm-noMainWindowError").label);
  64.             window.close();
  65.         }, 0);
  66.         return;
  67.     }
  68.  
  69.     setTimeout(window.focus, 0);
  70.  
  71.     Custom.deleteOrRestoreMenus("restore");
  72.  
  73. // clone some items in option panel
  74.     var positionRaidoBox = document.getElementById("position-menu");
  75.     for (var item = positionRaidoBox.parentNode.nextSibling; item; item=item.nextSibling) {
  76.         var radioGroup = positionRaidoBox.cloneNode(true);
  77.         radioGroup.id = "position-" + item.getAttribute("button");
  78.         item.appendChild(radioGroup);
  79.     }
  80.  
  81.     document.getElementById("bookmarksRightClickOpens").appendChild(
  82.         document.getElementById("bookmarksMiddleClickOpens").firstChild.cloneNode(true)
  83.     );
  84.     document.getElementById("historyRightClickOpens").appendChild(
  85.         document.getElementById("historyMiddleClickOpens").firstChild.cloneNode(true)
  86.     );
  87.  
  88. // load the settings
  89.     for (var i=0; i<this.checkbox.length; i++)
  90.         document.getElementById(this.checkbox[i]).checked = CMCE.pref.getBoolPref(this.checkbox[i]);
  91.  
  92.     for (var i=0; i<this.countbox.length; i++)
  93.         document.getElementById(this.countbox[i]).value = CMCE.pref.getIntPref(this.countbox[i]);
  94.  
  95.     for (var i=0; i<this.radiogroup.length; i++)
  96.         document.getElementById(this.radiogroup[i]).selectedIndex = CMCE.pref.getIntPref(this.radiogroup[i]);
  97.  
  98.     var buttonStyle = CMCE.pref.getBoolPref("buttonStyle");
  99.     document.getElementById("buttonStyle").selectedIndex = buttonStyle ? 0 : 1;
  100.     this.disableSubSetting(!buttonStyle, ["noarrow"]);
  101.  
  102.     this.disableSubSetting(!CMCE.pref.getBoolPref("toolbarCollapsed"), ["altToggle", "hideBorderTop"]);
  103.  
  104. // disable and hide the unavailable items
  105.     var isFX1_5 = CMCE.firefox.getElementById("Tools:Extensions");
  106.     var isFX3 = CMCE.firefox.getElementById("placesCommands");
  107.     var notFX3 = CMCE.firefox.getElementById("menu_BookmarksPopup");
  108.     var history_sub = CMCE.firefox.getElementById("hsub0");
  109.  
  110.     if (history_sub) document.getElementById("history_settings").selectedIndex = 1;
  111.  
  112.     if (isFX1_5 && navigator.oscpu == "Windows NT 6.0") document.getElementById("menu-position").hidden = true;
  113.  
  114.     var id = ["extTabMixPopup", "openHistoryManager", "yb_menu", "pof-menu", "ScrapBookMenu"];
  115.     var attr = ["uct", "ehm", "del", "pof", "scrapbook"];
  116.     for (var i=0; i<attr.length; i++) {
  117.         var extension = CMCE.firefox.getElementById(id[i]);
  118.         // the checking for "undo close tab" is different
  119.         if (i == 0) extension = extension || CMCE.firefox.getElementById("sessionmanager-menu") || !isFX1_5;
  120.  
  121.         if (!extension) {
  122.             var item = document.getElementsByAttribute("attr", attr[i]);
  123.             for (var j=0; j<item.length; j++) {
  124.                 item[j].tooltip = "cm-"+attr[i];
  125.                 item[j].setAttribute("disabled", true);
  126.             }
  127.         }
  128.     }
  129.  
  130.     // hide the unavailable items that work with specific FX versions
  131.     var check = [isFX3, notFX3];
  132.     var attr = ["fx3", "not-fx3"];
  133.     for (var i=0; i<check.length; i++)
  134.         if (!check[i]) {
  135.             var item = document.getElementsByAttribute("attr", attr[i]);
  136.             for (var j=0; j<item.length; j++) item[j].hidden = true;
  137.         }
  138.  
  139.     // remove the "top-right" radio item if the language is right to left, as it does not work normally in not-FX3
  140.     if (notFX3 && document.documentElement.getAttribute("chromedir") == "rtl") {
  141.         var item = document.getElementById("position-topleft");
  142.         item.firstChild.disabled = true;
  143.         item.hidden = true;
  144.     }
  145.  
  146. // use this attribute to set some css style for fx3
  147.     if (isFX3 && navigator.platform.indexOf("Linux")  == -1) document.documentElement.setAttribute("fx3", true);
  148.  
  149. // apply the tree item icon for fx2 and fx1.5
  150.     if (notFX3)
  151.         while(true) {
  152.             var treecol = document.getElementById("title");
  153.             if (treecol) treecol.id = "Name";
  154.             else break;
  155.         }
  156.  
  157. // load settings of menulists
  158.     for (var i=0; i<this.selected.length; i++) {
  159.         var list = document.getElementById(this.selected[i]);
  160.         for (var item=list.firstChild.firstChild; item; item=item.nextSibling)
  161.             if (item.getAttribute("value") == CMCE.pref.getIntPref(this.selected[i])) {
  162.                 list.selectedItem = item;
  163.                 break;
  164.             }
  165.         try {
  166.             document.getAnonymousElementByAttribute(list, "class", "menulist-label-box").lastChild.disabled = item.hasAttribute("disabled");
  167.         } catch(e) {}
  168.     }
  169.  
  170.     var tree = document.getElementById("available-tree-temp").lastChild;
  171.     this.loadMenus(
  172.         CMCE.firefox.getElementById("main-menubar"),
  173.         tree,
  174.         tree.childNodes[4]
  175.     );
  176.  
  177.     var toolbars = CMCE.firefox.getElementsByTagName("toolbar");
  178. //    for (var i=0; i<toolbars.length; i++)
  179. //        if (toolbars[i].id != "FindToolbar" && toolbars[i].id != "aios-toggle-toolbar" && toolbars[i].className != "cm-toolbar")
  180. //            this.loadItems(toolbars[i], document.getElementById("avail-toolbar-tree-temp").lastChild, null, false, true);
  181.     this.loadItems(CMCE.firefox.getElementById("navigator-toolbox").palette,
  182.         document.getElementById("avail-toolbar-tree-temp").lastChild, null, false, true);
  183.  
  184.     this.loadAvailList("available-tree", "available-tree-temp");
  185.     this.loadAvailList("available-tree2", "available-tree-temp");
  186.     this.loadAvailList("avail-toolbar-tree", "avail-toolbar-tree-temp");
  187.     this.loadAvailList("avail-toolbar-tree2", "avail-toolbar-tree-temp");
  188.  
  189. // load the menu button items list
  190.     this.loadList(CMCE.getItemListFromPref("itemlist"), "menubutton-tree", "available-tree", "avail-toolbar-tree");
  191.     this.loadList(CMCE.getItemListFromPref("showlist"), "context-tree", "available-tree2", "avail-toolbar-tree2");
  192.  
  193. // select the tree
  194.     if (window.arguments) this.switchList(window.arguments[0]);
  195. },
  196.  
  197. loadAvailList: function(id, tempId) {
  198.     var clone = document.getElementById(tempId).cloneNode(true);
  199.     var tree = document.getElementById(id);
  200.     clone.id = id;
  201.     tree.parentNode.replaceChild(clone, tree);
  202.     clone.addEventListener("DOMAttrModified", Setting.onToggleOpen, false);
  203.  
  204.     if (id == "available-tree2")
  205.         clone.getElementsByAttribute("targetId", "compact-extra-prefs")[0].setAttribute("targetId", "compact-showhide-prefs");
  206. },
  207.  
  208. loadMenus: function(menubar, tree, listEnd) {
  209.     for (var item=menubar.firstChild; item; item=item.nextSibling) {
  210.         if (item.id == "tinymenu" || item.id == "mergedmenu") {
  211.             var treeItem = document.getElementById("folder-temp").cloneNode(true);
  212.             treeItem.removeAttribute("id");
  213.             treeItem.setAttribute("targetId", item.id);
  214.             treeItem.firstChild.firstChild.setAttribute("label", item.getAttribute("label"));
  215.  
  216.             tree.insertBefore(treeItem, listEnd);
  217.             this.loadMenus(item.firstChild, treeItem.lastChild, null);
  218.             treeItem.setAttribute(treeItem.lastChild.hasChildNodes() ? "open" : "empty", true);
  219.         }
  220.         else if (item.tagName == "menu") this.loadItems(item, tree, listEnd);
  221.         else if (item.advRestorePoint) this.loadItems(CMCE.firefox.getElementById(item.oriId), tree, listEnd);
  222.     }
  223. },
  224.  
  225. loadItems: function(parent, tree, listEnd, loadSubmenu, loadToolbar) {
  226.     var isNotAvail = false;
  227.  
  228.     if (!loadToolbar) {
  229.         var treeItem = document.getElementById("folder-temp").cloneNode(true);
  230.         treeItem.removeAttribute("id");
  231.         if (parent.id) treeItem.setAttribute("targetId", parent.id);
  232.         else {
  233.             treeItem.firstChild.firstChild.setAttribute("properties", "separator");
  234.             isNotAvail = true;
  235.         }
  236.  
  237.         var label = parent.getAttribute("label");
  238.  
  239.         parent = parent.firstChild;
  240.         if (!parent) return;
  241.  
  242.         treeItem.firstChild.firstChild.setAttribute("label", label ? label :  "( " + parent.id + " )");
  243.         tree.insertBefore(treeItem, listEnd);
  244.         tree = treeItem.lastChild;
  245.     }
  246.  
  247.     for (var item=parent.firstChild; item; item=item.nextSibling) {
  248.         try {
  249.             if (
  250.                 item.tagName == "menu" &&
  251.                 (CMCE.isPureContainer(item) || item.id == "viewFullZoomMenu") &&
  252.                 CMCE.isPureContainer(item.firstChild) &&
  253.                 item.className != "menu-iconic bookmark-item"
  254.             ) {
  255.                 this.loadItems(item, tree, null, true);
  256.                 continue;
  257.             }
  258.             if (
  259.                 // check for incompatible items
  260.                 !item.getAttribute("oncommand") && !item.getAttribute("command") && !item.hasChildNodes()
  261.                     && !item.getAttribute("onclick") && !item.getAttribute("onmouseup") && !item.getAttribute("onmousedown")
  262.                 || item.className == "menuitem-iconic bookmark-item"
  263.                 || (item.className == "menu-iconic bookmark-item" && item.id != "bookmarksToolbarFolderMenu")
  264.                 || !item.id
  265.                 // check for known-incompatible toolbar items
  266.                 || item.id == "urlbar-container"
  267.                 || item.id == "menubar-items"
  268.                 || item.id == "search-container"
  269.                 || item.id == "ScrapBookEditTitle"
  270.                 || item.className  == "cm-button"
  271.                 // now check for known-incompatible items
  272.                 || item.id == "bookmarkAllCmd" && !CMCE.firefox.getElementById("placesCommands")
  273.                 || item.id == "splitbrowser-syncScroll"
  274.             ) continue;
  275.  
  276.             treeItem = document.getElementById("item-temp").cloneNode(true);
  277.             treeItem.removeAttribute("id");
  278.             treeItem.setAttribute("targetId", item.id);
  279.             this.setLabel(item, treeItem.firstChild.firstChild);
  280.             if (item.tagName == "menu") {
  281.                 treeItem.setAttribute("container", true);
  282.                 treeItem.setAttribute("empty", true);
  283.             }
  284.             tree.appendChild(treeItem);
  285.         } catch(e) {}
  286.     }
  287.  
  288.     if (isNotAvail && !tree.hasChildNodes()) {
  289.         if (isNotAvail) tree.parentNode.parentNode.removeChild(tree.parentNode);
  290.         else tree.parentNode.setAttribute("empty", true);
  291.     }
  292. },
  293.  
  294. switchList: function(listId) {
  295.     var index = listId == "context-tree" ? 1 : 0;
  296.     var panel = document.getElementById("editmenu-panel");
  297.  
  298.     var caption = document.getElementById("editPanelCap");
  299.     caption.selectedIndex = index;
  300.  
  301.     panel.setAttribute("currentList", index);
  302.  
  303.     var tree = document.getElementById(listId);
  304.     this.currentList = index;
  305.     this.currentAvailList =
  306.         tree.currentIndex == -1 ||
  307.             tree.view.getItemAtIndex(tree.currentIndex).parentNode.parentNode.getAttribute("targetId") != "cm-buttons-box" ?
  308.             1 : 2;
  309.     panel.setAttribute("availList", this.currentAvailList);
  310.  
  311.     caption.previousSibling.firstChild.value = caption.selectedItem.label;
  312.  
  313.     setTimeout(function(This){
  314.         document.getElementById(This.lists[This.currentList][0]).focus();
  315.         document.getElementById(This.lists[This.currentList][This.currentAvailList]).focus();
  316.     }, 0, this);
  317. },
  318.  
  319. setSubmenu: function(menu){
  320.     var check = {value: false};
  321.     var label = {value: menu.firstChild.firstChild.getAttribute("label")}
  322.     do CMCE.prompts.prompt(
  323.             null, "Personal Menu",
  324.             document.getElementById("cm-labelPrompt").label,
  325.             label,
  326.             null,
  327.             check);
  328.     while (label.value == "");
  329.     if (label.value) menu.firstChild.firstChild.setAttribute("label", label.value);
  330.  
  331.     var key = {value: menu.getAttribute("accesskey")}
  332.     if(key.value == "empty") key.value = "";
  333.     CMCE.prompts.prompt(
  334.             null, "Personal Menu",
  335.             document.getElementById("cm-accesskeyPrompt").label,
  336.             key,
  337.             null,
  338.             check);
  339.     if (key.value || key.value == "") {
  340.         menu.setAttribute("accesskey", key.value ? key.value : "empty");
  341.         return true;
  342.     }
  343.     else return label.value ? true : false;
  344. },
  345.  
  346. refreshItemAppearance: function(item) {
  347.     try {
  348.         Components.classes["@mozilla.org/inspector/dom-utils;1"].getService(Components.interfaces["inIDOMUtils"])
  349.             .setContentState(item, 4);
  350.     } catch(e) {}
  351. },
  352.  
  353. onToggleOpen: function(event){
  354.     if (event.attrName == "open")
  355.         if (event.prevValue == "true")
  356.             for (var item=event.target.lastChild.firstChild; item; item=item.nextSibling)
  357.                 item.removeAttribute("open");
  358.         else if (event.target.getAttribute("empty") == "true") event.target.removeAttribute("open");
  359. },
  360.  
  361. updateButtonStatus: function(tree) {
  362.     setTimeout( function(tree) {
  363.         if (!tree.view) return;
  364.         var  buttons = document.getElementById("button-box").childNodes;
  365.         var select = tree.view.selection.count == 0 ? null : tree.view.getItemAtIndex(tree.currentIndex);
  366.         if (tree.id == Setting.lists[Setting.currentList][Setting.currentAvailList])
  367.             buttons[1].disabled = !select || select.firstChild.firstChild.getAttribute("properties") == "separator";
  368.         else {
  369.             buttons[2].disabled = !select || !select.nextSibling;
  370.             buttons[4].disabled = !select || !select.previousSibling;
  371.             buttons[5].disabled = !select || !select.nextSibling || select.nextSibling.hidden;
  372.             buttons[7].disabled = !select || select.parentNode.parentNode.getAttribute("targetId") != "cm-submenu" || !select.nextSibling;
  373.             buttons[8].disabled = !select || !select.nextSibling || select.nextSibling.getAttribute("targetId") != "cm-submenu";
  374.             buttons[10].disabled = !select || select.getAttribute("targetId") != "cm-submenu";
  375.  
  376.             buttons[10].hidden = select && select.getAttribute("targetId") == "cm-buttons-box";
  377.             buttons[11].hidden = !buttons[10].hidden;
  378.         }
  379.     }, 0, tree);
  380. },
  381.  
  382. addItem: function(){
  383.     var fromTree = document.getElementById(this.lists[this.currentList][this.currentAvailList]);
  384.     var fromSelect = fromTree.view.selection.count == 0 ? null : fromTree.view.getItemAtIndex(fromTree.currentIndex);
  385.     var toTree = document.getElementById(this.lists[this.currentList][0]);
  386.     var toSelect = toTree.view.selection.count == 0 ? null : toTree.view.getItemAtIndex(toTree.currentIndex);
  387.  
  388.     if (!fromSelect || fromSelect.firstChild.firstChild.getAttribute("properties") =="separator") return;
  389.  
  390.     var targetId = fromSelect.getAttribute("targetId");
  391.  
  392.     if (targetId == "----") {
  393.         var clone = document.getElementById("separator-temp").cloneNode(true);
  394.         clone.removeAttribute("id");
  395.     }
  396.     else if (targetId == "cm-submenu") {
  397.         var clone = document.getElementById("submenu-temp").cloneNode(true);
  398.         if (!this.setSubmenu(clone)) return;
  399.  
  400.         clone.removeAttribute("id");
  401.         clone.setAttribute("open", true);
  402.         var menuend = document.getElementById("submenu-end-temp").cloneNode(true);
  403.         menuend.removeAttribute("id");
  404.         clone.lastChild.appendChild(menuend);
  405.     }
  406.     else if (targetId == "cm-buttons-box") {
  407.         var clone = document.getElementById("buttonbox-temp").cloneNode(true);
  408.         clone.removeAttribute("id");
  409.         clone.setAttribute("open", true);
  410.         var menuend = document.getElementById("submenu-end-temp").cloneNode(true);
  411.         menuend.removeAttribute("id");
  412.         menuend.setAttribute("targetId", "cm-buttons-box-end");
  413.         clone.lastChild.appendChild(menuend);
  414.         window.openDialog('chrome://compact-ce/content/toolbar.xul',
  415.                 'Customize Toolbar',
  416.                 'chrome,centerscreen,dialog,modal,close=no',
  417.                 clone);
  418.     }
  419.     else if (targetId == "cm-toolbar-spring" || targetId == "cm-toolbar-spacer") {
  420.         var clone = document.getElementById(targetId + "-temp").cloneNode(true);
  421.         clone.removeAttribute("id");
  422.     }
  423.     else {
  424.         var fromSelectIndex = fromTree.currentIndex;
  425.         var fromSelectIsContainer = fromSelect.getAttribute("container") && !fromSelect.getAttribute("empty");
  426.  
  427.         var clone = fromSelect.cloneNode(true);
  428.         if (clone.childNodes.length == 2) clone.removeChild(clone.lastChild);
  429.         clone.removeAttribute("open");
  430.  
  431.         if (fromSelectIsContainer) {
  432.             clone.setAttribute("empty", true);
  433.             fromSelect.firstChild.firstChild.setAttribute("properties", "separator");
  434.         }
  435.         else fromSelect.hidden = true;
  436.         fromSelect.isAdded = true;
  437.  
  438.         // set the selection of from-tree
  439.         if (fromSelectIsContainer && fromSelectIndex < fromTree.view.rowCount - 1)
  440.             fromTree.view.selection.select(fromSelectIndex +
  441.                 (
  442.                     fromTree.view.getItemAtIndex(fromSelectIndex + 1).parentNode == fromSelect.parentNode ?
  443.                         1 : -1
  444.                 )
  445.             );
  446.         else if (
  447.             fromSelectIndex < fromTree.view.rowCount &&
  448.             fromTree.view.getItemAtIndex(fromSelectIndex).parentNode == fromSelect.parentNode
  449.         )
  450.             fromTree.view.selection.select(fromSelectIndex);
  451.         else
  452.             fromTree.view.selection.select(fromSelectIndex - 1);
  453.     }
  454.  
  455.     if (fromTree.currentIndex >= 0) fromTree.view.selection.tree.ensureRowIsVisible(fromTree.currentIndex);
  456.  
  457.     // append the clone, if to-select is the default item -- "edit this menu", insert before it
  458.     if (toSelect) toSelect.parentNode.insertBefore(clone, toSelect.nextSibling ? toSelect.nextSibling : toSelect);
  459.     else toTree.lastChild.insertBefore(clone, toTree.lastChild.lastChild);
  460.  
  461.     // if to-select is the default item, hide it
  462.     if (clone.parentNode.childNodes.length == 2) clone.nextSibling.hidden = true;
  463.  
  464.     // select the clone, if the clone is submenu, select the default item
  465.     toTree.view.selection.select(
  466.         toTree.view.getIndexOfItem(
  467.             targetId == "cm-submenu" || targetId == "cm-buttons-box" ? menuend : clone
  468.         )
  469.     );
  470.     toTree.view.selection.tree.ensureRowIsVisible(toTree.currentIndex);
  471.  
  472.     this.refreshItemAppearance(fromTree);
  473.     this.refreshItemAppearance(toTree);
  474.  
  475.     this.enbleApply();
  476. },
  477.  
  478. removeItem: function(){
  479.     var fromTree = document.getElementById(this.lists[this.currentList][0]);
  480.     var select = fromTree.view.selection.count == 0 ? null : fromTree.view.getItemAtIndex(fromTree.currentIndex);
  481.  
  482.     if (
  483.         !select ||
  484.         select.parentNode.childNodes.length == 1 ||
  485.         (select.getAttribute("targetId") == "cm-submenu" || select.getAttribute("targetId") == "cm-buttons-box") &&
  486.             !CMCE.prompts.confirm(null, "Personal Menu", document.getElementById("cm-removeSubConfirm").label)
  487.     ) return;
  488.  
  489.     var toTree = document.getElementById(this.lists[this.currentList][this.currentAvailList]);
  490.  
  491.     var toSelectIndex = -1;
  492.     if (select.getAttribute("targetId") == "cm-submenu") {
  493.         this.restoreItemsInMenu(select, toTree);
  494.         toSelectIndex = 1;
  495.     }
  496.     else if (select.getAttribute("targetId") == "cm-buttons-box") {
  497.         this.restoreItemsInMenu(select, document.getElementById(this.lists[this.currentList][2]));
  498.         toSelectIndex = 2;
  499.     }
  500.     else {
  501.         var same = this.restoreItem(select, toTree);
  502.         if (same) toSelectIndex = toTree.view.getIndexOfItem(same);
  503.     }
  504.  
  505.     if (toSelectIndex > -1) {
  506.         toTree.view.selection.select(toSelectIndex);
  507. //        toTree.view.selection.tree.ensureRowIsVisible(toSelectIndex);
  508.     }
  509.  
  510.     var selectIndex = fromTree.currentIndex;
  511.     select.hidden = true;
  512.  
  513.     // show "edit this menu" if the submenu is empty after the remove
  514.     if (select.parentNode.childNodes.length == 2) select.nextSibling.hidden = false;
  515.  
  516.     // set the selection of the tree
  517.     if (selectIndex == 0)
  518.         fromTree.view.selection.select(0);
  519.     else if (fromTree.view.getItemAtIndex(selectIndex-1) == select.parentNode.parentNode)
  520.         fromTree.view.selection.select(selectIndex);
  521.     else if (
  522.         selectIndex < fromTree.view.rowCount &&
  523.         fromTree.view.getItemAtIndex(selectIndex-1).parentNode != select.parentNode
  524.     )
  525.         fromTree.view.selection.select(fromTree.view.getIndexOfItem(select.previousSibling));
  526.     else
  527.         fromTree.view.selection.select(selectIndex-1);
  528.     fromTree.view.selection.tree.ensureRowIsVisible(fromTree.currentIndex);
  529.  
  530.     select.parentNode.removeChild(select);
  531.  
  532.     this.refreshItemAppearance(toTree);
  533.     this.refreshItemAppearance(fromTree);
  534.  
  535.     this.enbleApply();
  536. },
  537.  
  538. restoreItemsInMenu: function(menu, toTree) {
  539.     for (var item=menu.lastChild.firstChild; item; item=item.nextSibling)
  540.         if (item.getAttribute("targetId") == "cm-submenu")
  541.             this.restoreItemsInMenu(item, toTree);
  542.         else
  543.             this.restoreItem(item, toTree);
  544. },
  545.  
  546. restoreItem: function(item, toTree) {
  547.     var same = toTree.getElementsByAttribute("targetId", item.getAttribute("targetId"));
  548.     for (var i=0; i<same.length; i++) {
  549.         same[i].isAdded = false;
  550.         if (same[i].allwaysDisabled) continue;
  551.  
  552.         if (same[i].getAttribute("container") && !same[i].getAttribute("empty"))
  553.             same[i].firstChild.firstChild.removeAttribute("properties");
  554.         else same[i].hidden = false;
  555.     }
  556.     return i == 0 ? null : same[i - 1];
  557. },
  558.  
  559. moveItem: function(move) {
  560.     var tree = document.getElementById(this.lists[this.currentList][0]);
  561.     var select = tree.view.selection.count == 0 ? null : tree.view.getItemAtIndex(tree.currentIndex);
  562.  
  563.     if (
  564.         !select ||
  565.         select.parentNode.childNodes.length == 1 ||
  566.         move == -1 && !select.previousSibling ||
  567.         (move == 1 || move == 2) && select.nextSibling.hidden ||
  568.         move == -2 && select.parentNode.parentNode.getAttribute("targetId") != "cm-submenu" ||
  569.         move == 2 && select.nextSibling.getAttribute("targetId") != "cm-submenu"
  570.     ) return;
  571.  
  572.     if (move == -1)
  573.         select.parentNode.insertBefore(select, select.previousSibling);
  574.     else if (move == 1)
  575.         select.parentNode.insertBefore(select.nextSibling, select);
  576.     else {
  577.         if (move == -2) {
  578.             if (select.parentNode.childNodes.length == 2) select.nextSibling.hidden = false;
  579.             var parent = select.parentNode.parentNode;
  580.             parent.parentNode.insertBefore(select, parent);
  581.         } else {
  582.             var parent = select.nextSibling.lastChild;
  583.             select.nextSibling.setAttribute("open", true);
  584.             parent.insertBefore(select, parent.firstChild);
  585.             if (parent.childNodes.length == 2) select.nextSibling.hidden = true;
  586.         }
  587.     }
  588.  
  589.     tree.view.selection.select(tree.view.getIndexOfItem(select));
  590.     tree.view.selection.tree.ensureRowIsVisible(tree.currentIndex);
  591.  
  592.     this.refreshItemAppearance(tree);
  593.  
  594.     this.enbleApply();
  595. },
  596.  
  597. renameItem: function() {
  598.     var tree = document.getElementById(Setting.lists[Setting.currentList][0]);
  599.     var select = tree.view.selection.count == 0 ? null : tree.view.getItemAtIndex(tree.currentIndex);
  600.     if (select && select.getAttribute("targetId") == "cm-submenu" && this.setSubmenu(select))
  601.         this.enbleApply();
  602. },
  603.  
  604. customizeItem: function() {
  605.     var tree = document.getElementById(Setting.lists[Setting.currentList][0]);
  606.     var select = tree.view.selection.count == 0 ? null : tree.view.getItemAtIndex(tree.currentIndex);
  607.     if (select && select.getAttribute("targetId") == "cm-buttons-box") {
  608.         window.openDialog(
  609.             "chrome://compact-ce/content/toolbar.xul", null,
  610.             "chrome,centerscreen,dialog,modal,close=no", select);
  611.         this.enbleApply();
  612.     }
  613. },
  614.  
  615. im_exportList: function(button) {
  616.     var currentList = this.saveList(this.lists[this.currentList][0]);
  617.  
  618.     var check = {value: false};
  619.     var list = {value: currentList};
  620.  
  621.     CMCE.prompts.prompt(
  622.         null, button.tooltipText,
  623.         button.getAttribute("text1") + "\n" + button.getAttribute("text2"),
  624.         list,
  625.         null,
  626.         check);
  627.     if ((list.value || list.value == "") && list.value != currentList) {
  628.         this.loadAvailList(this.lists[this.currentList][1], "available-tree-temp");
  629.         this.loadAvailList(this.lists[this.currentList][2], "avail-toolbar-tree-temp");
  630.         this.loadList(
  631.             CMCE.fromStringtoArray(list.value, ","),
  632.             this.lists[this.currentList][0],
  633.             this.lists[this.currentList][1],
  634.             this.lists[this.currentList][2]
  635.         );
  636.         this.currentAvailList = 1;
  637.         document.getElementById("editmenu-panel").setAttribute("availList", 1);
  638.         document.getElementById(this.lists[this.currentList][0]).focus();
  639.         document.getElementById(this.lists[this.currentList][1]).focus();
  640.         this.enbleApply();
  641.     }
  642. },
  643.  
  644. availTreeOndblclick: function(tree) {
  645.     var select = tree.view.getItemAtIndex(tree.currentIndex);
  646.     if (!select.getAttribute("container") || select.getAttribute("empty")) {
  647.         Setting.addItem();
  648.         select.removeAttribute("open");
  649.     }
  650. },
  651.  
  652. itemTreeOnselect: function(tree) {
  653.     this.currentAvailList =
  654.         tree.currentIndex == -1 ||
  655.             tree.view.getItemAtIndex(tree.currentIndex).parentNode.parentNode.getAttribute("targetId") != "cm-buttons-box"
  656.         ?
  657.             1 : 2;
  658.     document.getElementById("editmenu-panel").setAttribute("availList", this.currentAvailList);
  659.     this.updateButtonStatus(document.getElementById(this.lists[this.currentList][this.currentAvailList]));
  660. },
  661.  
  662. saveSettings: function() {
  663.     for (var i=0; i<this.selected.length; i++) CMCE.pref.setIntPref(this.selected[i], document.getElementById(this.selected[i]).value);
  664.     for (var i=0; i<this.countbox.length; i++) CMCE.pref.setIntPref(this.countbox[i], document.getElementById(this.countbox[i]).value);
  665.     for (var i=0; i<this.checkbox.length; i++) CMCE.pref.setBoolPref(this.checkbox[i], document.getElementById(this.checkbox[i]).checked);
  666.     for (var i=0; i<this.radiogroup.length; i++) CMCE.pref.setIntPref(this.radiogroup[i], document.getElementById(this.radiogroup[i]).selectedIndex);
  667.  
  668.     CMCE.pref.setBoolPref("buttonStyle", document.getElementById("buttonStyle").value == 0);
  669.  
  670.     nsPreferences.setUnicharPref("compact.menu.itemlist", this.saveList("menubutton-tree"));
  671.     nsPreferences.setUnicharPref("compact.menu.showlist", this.saveList("context-tree"));
  672.  
  673.     if (!CMCE.firefox.getElementById("cmd_CustomizeToolbars").getAttribute("disabled")) {
  674.         Custom.unAdv();
  675.         CMCE.advMode();
  676.     }
  677.  
  678.     Custom.deleteOrRestoreMenus("delete");
  679.  
  680.     CMCE.modifyGoMenu();
  681.     CMCE.updateIcon();
  682.     CMCE.toolbar = CMCE.firefox.getElementById("toolbar-menubar");
  683.     CMCE.toolbar.altToggle = CMCE.pref.getBoolPref("altToggle");
  684.     CMCE.toolbar.setAttribute("hideBorderTop", CMCE.pref.getBoolPref("hideBorderTop"));
  685.     CMCE.toolbar._collapsed = CMCE.pref.getBoolPref("toolbarCollapsed");
  686. },
  687.  
  688. saveList: function(listId) {
  689.     var string = "";
  690.     var item = document.getElementById(listId).lastChild.firstChild;
  691.  
  692.     while (item) {
  693.         var id = item.getAttribute("targetId");
  694.         if (id) string = string + (string ? "," : "") + id;
  695.         else return string;
  696.  
  697.         if (id == "cm-submenu" || id == "cm-buttons-box") {
  698.             if (id == "cm-submenu")
  699.                 string = string + "," + item.firstChild.firstChild.getAttribute("label") + "," + item.getAttribute("accesskey");
  700.             else
  701.                 string = string + "," + item.getAttribute("adv") + "," + item.getAttribute("iconsize") + "," + item.getAttribute("mode");
  702.             item = item.lastChild.firstChild;
  703.         } else {
  704.             if (id == "cm-submenu-end" || id == "cm-buttons-box-end") item = item.parentNode.parentNode;
  705.             item = item.nextSibling;
  706.         }
  707.     }
  708.  
  709.     return string;
  710. },
  711.  
  712. loadList: function(array, itemTree, availTreeId, availTBTreeId) {
  713.     var availItmTree = document.getElementById(availTreeId).lastChild;
  714.     var availTBItmTree = document.getElementById(availTBTreeId).lastChild;
  715.  
  716.     var availTree = availItmTree;
  717.  
  718.     var tree = document.getElementById(itemTree);
  719.     var clone = document.getElementById("item-tree-temp").cloneNode(true);
  720.     tree.parentNode.replaceChild(clone, tree);
  721.     clone.id = itemTree;
  722.  
  723.     clone.addEventListener("DOMAttrModified", Setting.onToggleOpen, false);
  724.  
  725.     tree = clone.lastChild;
  726.  
  727.     for (var i=0; i<array.length; i++) {
  728.         if (array[i] == "----") {
  729.             var treeItem = document.getElementById("separator-temp").cloneNode(true);
  730.             treeItem.removeAttribute("id");
  731.             tree.appendChild(treeItem);
  732.         } else {
  733.             if (array[i] == "cm-submenu") {
  734.                 var treeItem = document.getElementById("submenu-temp").cloneNode(true);
  735.                 treeItem.removeAttribute("id");
  736.                 treeItem.firstChild.firstChild.setAttribute("label",  array[++i]);
  737.                 treeItem.setAttribute("accesskey",  array[++i]);
  738.  
  739.                 tree.appendChild(treeItem);
  740.                 tree = treeItem.lastChild;
  741.             }
  742.             else if (array[i] == "cm-submenu-end") {
  743.                 var treeItem = document.getElementById("submenu-end-temp").cloneNode(true);
  744.                 treeItem.removeAttribute("id");
  745.                 if (tree.hasChildNodes()) treeItem.hidden = true;
  746.                 tree.appendChild(treeItem);
  747.                 tree = tree.parentNode.parentNode;
  748.             }
  749.             else if (array[i] == "cm-buttons-box") {
  750.                 var treeItem = document.getElementById("buttonbox-temp").cloneNode(true);
  751.                 treeItem.removeAttribute("id");
  752.                 treeItem.setAttribute("adv",  array[++i]);
  753.                 treeItem.setAttribute("iconsize",  array[++i]);
  754.                 treeItem.setAttribute("mode",  array[++i]);
  755.  
  756.                 tree.appendChild(treeItem);
  757.                 tree = treeItem.lastChild;
  758.                 availTree = availTBItmTree;
  759.             }
  760.             else if (array[i] == "cm-toolbar-spring" || array[i] == "cm-toolbar-spacer") {
  761.                 var treeItem = document.getElementById(array[i] + "-temp").cloneNode(true);
  762.                 treeItem.removeAttribute("id");
  763.                 tree.appendChild(treeItem);
  764.             }
  765.             else if (array[i] == "cm-buttons-box-end") {
  766.                 var treeItem = document.getElementById("submenu-end-temp").cloneNode(true);
  767.                 treeItem.removeAttribute("id");
  768.                 treeItem.setAttribute("targetId", "cm-buttons-box-end");
  769.                 if (tree.hasChildNodes()) treeItem.hidden = true;
  770.                 tree.appendChild(treeItem);
  771.                 tree = tree.parentNode.parentNode;
  772.                 availTree = availItmTree;
  773.             }
  774.             else if (!array[i]) continue;
  775.             else {
  776.                 var treeItem = document.getElementById("item-temp").cloneNode(true);
  777.                 treeItem.setAttribute("targetId",  array[i]);
  778.                 treeItem.removeAttribute("id");
  779.  
  780.                 var same = availTree.getElementsByAttribute("targetId", array[i])[0];
  781.                 if (same) {
  782.                     if (same.getAttribute("container") && !same.getAttribute("empty"))
  783.                         same.firstChild.firstChild.setAttribute("properties", "separator");
  784.                     else same.hidden = true;
  785.                     same.isAdded = true
  786.                 }
  787.                 var target = CMCE.firefox.getElementById(array[i]);
  788.                 if (target) {
  789.                     this.setLabel(target, treeItem.firstChild.firstChild);
  790.                     if (target.tagName == "menu") {
  791.                         treeItem.setAttribute("container",  true);
  792.                         treeItem.setAttribute("empty", true);
  793.                     }
  794.                 } else if (same) {
  795.                     this.setLabel(same.firstChild.firstChild, treeItem.firstChild.firstChild);
  796.                 } else{
  797.                     treeItem.firstChild.firstChild.setAttribute("label", "( " + unescape(array[i]) + " )");
  798.                     treeItem.firstChild.firstChild.setAttribute("properties", "separator");
  799.                 }
  800.                 tree.appendChild(treeItem);
  801.             }
  802.         }
  803.     }
  804.     treeItem = document.getElementById("submenu-end-temp").cloneNode(true);
  805.     treeItem.removeAttribute("id");
  806.     treeItem.removeAttribute("targetId");
  807.     if (tree.hasChildNodes()) treeItem.hidden = true;
  808.     tree.appendChild(treeItem);
  809. },
  810.  
  811. setLabel: function(item, li) {
  812.     var label = item.getAttribute("label");
  813.     if (!label) label = item.getAttribute("title");
  814.     if (!label) label =  "( " + item.id + " )";
  815.  
  816.     if (item.id == "unified-back-forward-button") label = item.firstChild.getAttribute("label") + item.childNodes[1].getAttribute("label");
  817.     else if (item.id == "personal-bookmarks") label = CMCE.firefox.getElementById("PersonalToolbar").toolbarName;
  818.  
  819.     li.setAttribute("label", label);
  820. },
  821.  
  822. warnOnChange: function(el, recommandStatus, textId){
  823.     if (el.checked != recommandStatus) {
  824.         el.checked = !el.checked;
  825.         if (CMCE.prompts.confirm(null, "Personal Menu", document.getElementById(textId).label)) {
  826.             this.enbleApply();
  827.             el.checked = !el.checked;
  828.         }
  829.     } else this.enbleApply();
  830. },
  831.  
  832. disableSubSetting: function(disable, list) {
  833.     for(var i = 0; i < list.length; i++) document.getElementById(list[i]).disabled = disable;
  834. },
  835.  
  836. enbleApply: function() {
  837.     document.documentElement._buttons.extra1.removeAttribute("disabled");
  838. }
  839.  
  840. }